import { microservicesConfig, testUtils } from '../support/microservices-config.js'

describe('用户中心模块端到端测试', () => {
  const { testData, endpoints, environment } = microservicesConfig
  let testUser

  before(() => {
    // 生成测试数据
    testUser = testUtils.generateTestUser('Student')
  })

  beforeEach(() => {
    // 忽略应用程序异常
    Cypress.on('uncaught:exception', (err) => {
      if (err.message.includes('Cannot read properties of null') || 
          err.message.includes('document') || 
          err.message.includes('window')) {
        return false
      }
      return true
    })
    
    cy.visit('/login')
  })

  describe('用户个人信息管理', () => {
    it('用户可以查看个人信息', () => {
      // 用户登录
      cy.get('[data-cy=account-input]').type(testData.users.student.account)
      cy.get('[data-cy=password-input]').type(testData.users.student.password)
      cy.get('[data-cy=login-button]').click()
      
      cy.url().should('include', '/mainPage')
      cy.wait(environment.timeouts.medium)
      
      // 进入用户中心
      cy.get('[data-cy=user-center-link], .user-info, .user-avatar').click()
      cy.url().should('include', '/user-center')
      
      // 验证个人信息显示
      cy.contains('个人信息').should('be.visible')
      
      // 验证用户信息字段
      const userInfoFields = ['用户名', '姓名', '邮箱', '角色']
      userInfoFields.forEach(field => {
        cy.get('body').then(($body) => {
          if ($body.text().includes(field)) {
            cy.contains(field).should('be.visible')
          }
        })
      })
      
      // 验证用户头像
      cy.get('.user-avatar, .avatar-img').should('be.visible')
    })

    it('用户可以编辑个人信息', () => {
      // 用户登录
      cy.get('[data-cy=account-input]').type(testData.users.student.account)
      cy.get('[data-cy=password-input]').type(testData.users.student.password)
      cy.get('[data-cy=login-button]').click()
      
      cy.url().should('include', '/mainPage')
      cy.wait(environment.timeouts.medium)
      
      // 进入用户中心
      cy.get('[data-cy=user-center-link], .user-info, .user-avatar').click()
      cy.url().should('include', '/user-center')
      
      // 点击编辑按钮
      cy.get('[data-cy=edit-profile], .edit-btn').click()
      
      // 编辑用户信息
      const newName = `更新姓名_${testUtils.generateRandomString(4)}`
      const newEmail = `updated.${testUtils.generateRandomString(4)}@test.com`
      
      cy.get('[data-cy=name-input], input[name="name"]').clear().type(newName)
      cy.get('[data-cy=email-input], input[name="email"]').clear().type(newEmail)
      
      // 保存更改
      cy.get('[data-cy=save-profile], .save-btn').click()
      cy.wait(environment.timeouts.medium)
      
      // 验证更新成功
      cy.contains(newName).should('be.visible')
      cy.contains(newEmail).should('be.visible')
    })

    it('用户可以修改密码', () => {
      // 用户登录
      cy.get('[data-cy=account-input]').type(testData.users.student.account)
      cy.get('[data-cy=password-input]').type(testData.users.student.password)
      cy.get('[data-cy=login-button]').click()
      
      cy.url().should('include', '/mainPage')
      cy.wait(environment.timeouts.medium)
      
      // 进入用户中心
      cy.get('[data-cy=user-center-link], .user-info, .user-avatar').click()
      cy.url().should('include', '/user-center')
      
      // 点击修改密码
      cy.get('[data-cy=change-password], .change-password-btn').click()
      
      // 填写密码表单
      cy.get('[data-cy=current-password], input[name="currentPassword"]').type(testData.users.student.password)
      cy.get('[data-cy=new-password], input[name="newPassword"]').type('NewPassword@123')
      cy.get('[data-cy=confirm-password], input[name="confirmPassword"]').type('NewPassword@123')
      
      // 提交密码修改
      cy.get('[data-cy=submit-password], .submit-btn').click()
      cy.wait(environment.timeouts.medium)
      
      // 验证修改成功（通过成功消息或重新登录）
      cy.get('body').then(($body) => {
        if ($body.text().includes('密码修改成功') || $body.find('.success-message').length > 0) {
          cy.contains('密码修改成功').should('be.visible')
        } else {
          cy.log('密码修改功能已执行')
        }
      })
    })
  })

  describe('我的课程管理', () => {
    it('学生可以查看已加入的课程', () => {
      // 学生登录
      cy.get('[data-cy=account-input]').type(testData.users.student.account)
      cy.get('[data-cy=password-input]').type(testData.users.student.password)
      cy.get('[data-cy=login-button]').click()
      
      cy.url().should('include', '/mainPage')
      cy.wait(environment.timeouts.medium)
      
      // 进入用户中心
      cy.get('[data-cy=user-center-link], .user-info').click()
      cy.url().should('include', '/user-center')
      
      // 查看我的课程
      cy.get('[data-cy=my-courses], .my-courses-tab').click()
      cy.wait(environment.timeouts.medium)
      
      // 验证课程列表
      cy.get('body').then(($body) => {
        if ($body.find('.course-card, .course-item').length > 0) {
          cy.get('.course-card, .course-item').should('be.visible')
          
          // 验证课程信息
          cy.get('.course-name, .course-title').should('be.visible')
          cy.get('.course-progress, .progress-bar').should('be.visible')
          
          cy.log('我的课程列表显示正常')
        } else {
          cy.contains('暂无课程').should('be.visible')
          cy.log('暂无课程，显示空状态')
        }
      })
    })

    it('教师可以查看教授的课程', () => {
      // 教师登录
      cy.get('[data-cy=account-input]').type(testData.users.teacher.account)
      cy.get('[data-cy=password-input]').type(testData.users.teacher.password)
      cy.get('[data-cy=login-button]').click()
      
      cy.url().should('include', '/mainPage')
      cy.wait(environment.timeouts.medium)
      
      // 进入用户中心
      cy.get('[data-cy=user-center-link], .user-info').click()
      cy.url().should('include', '/user-center')
      
      // 查看我的课程
      cy.get('[data-cy=my-courses], .my-courses-tab').click()
      cy.wait(environment.timeouts.medium)
      
      // 验证教师课程管理功能
      cy.get('body').then(($body) => {
        if ($body.find('.course-management, .manage-btn').length > 0) {
          cy.get('.course-management, .manage-btn').should('be.visible')
          cy.log('教师课程管理功能可用')
        } else {
          cy.log('教师课程管理功能不可用')
        }
      })
    })

    it('用户可以查看课程学习进度', () => {
      // 学生登录
      cy.get('[data-cy=account-input]').type(testData.users.student.account)
      cy.get('[data-cy=password-input]').type(testData.users.student.password)
      cy.get('[data-cy=login-button]').click()
      
      cy.url().should('include', '/mainPage')
      cy.wait(environment.timeouts.medium)
      
      // 进入用户中心
      cy.get('[data-cy=user-center-link], .user-info').click()
      cy.url().should('include', '/user-center')
      
      // 查看学习进度
      cy.get('[data-cy=learning-progress], .progress-tab').click()
      cy.wait(environment.timeouts.medium)
      
      // 验证进度显示
      cy.get('body').then(($body) => {
        if ($body.find('.progress-chart, .progress-stats').length > 0) {
          cy.get('.progress-chart, .progress-stats').should('be.visible')
          
          // 验证进度数据
          cy.get('.progress-percentage, .completion-rate').should('contain.text', '%')
          
          cy.log('学习进度显示正常')
        } else {
          cy.log('学习进度功能不可用')
        }
      })
    })
  })

  describe('学习成果展示', () => {
    it('学生可以查看获得的成绩', () => {
      // 学生登录
      cy.get('[data-cy=account-input]').type(testData.users.student.account)
      cy.get('[data-cy=password-input]').type(testData.users.student.password)
      cy.get('[data-cy=login-button]').click()
      
      cy.url().should('include', '/mainPage')
      cy.wait(environment.timeouts.medium)
      
      // 进入用户中心
      cy.get('[data-cy=user-center-link], .user-info').click()
      cy.url().should('include', '/user-center')
      
      // 查看成绩
      cy.get('[data-cy=my-grades], .grades-tab').click()
      cy.wait(environment.timeouts.medium)
      
      // 验证成绩列表
      cy.get('body').then(($body) => {
        if ($body.find('.grade-item, .score-card').length > 0) {
          cy.get('.grade-item, .score-card').should('be.visible')
          
          // 验证成绩信息
          cy.get('.exercise-name, .assignment-name').should('be.visible')
          cy.get('.score, .grade-value').should('be.visible')
          
          cy.log('成绩列表显示正常')
        } else {
          cy.contains('暂无成绩').should('be.visible')
          cy.log('暂无成绩，显示空状态')
        }
      })
    })

    it('学生可以查看学习证书', () => {
      // 学生登录
      cy.get('[data-cy=account-input]').type(testData.users.student.account)
      cy.get('[data-cy=password-input]').type(testData.users.student.password)
      cy.get('[data-cy=login-button]').click()
      
      cy.url().should('include', '/mainPage')
      cy.wait(environment.timeouts.medium)
      
      // 进入用户中心
      cy.get('[data-cy=user-center-link], .user-info').click()
      cy.url().should('include', '/user-center')
      
      // 查看证书
      cy.get('body').then(($body) => {
        if ($body.find('[data-cy=certificates], .certificates-tab').length > 0) {
          cy.get('[data-cy=certificates], .certificates-tab').click()
          cy.wait(environment.timeouts.medium)
          
          // 验证证书列表
          cy.get('.certificate-item, .certificate-card').should('be.visible')
          cy.log('学习证书功能可用')
        } else {
          cy.log('学习证书功能不可用')
        }
      })
    })
  })

  describe('系统设置', () => {
    it('用户可以修改系统偏好设置', () => {
      // 用户登录
      cy.get('[data-cy=account-input]').type(testData.users.student.account)
      cy.get('[data-cy=password-input]').type(testData.users.student.password)
      cy.get('[data-cy=login-button]').click()
      
      cy.url().should('include', '/mainPage')
      cy.wait(environment.timeouts.medium)
      
      // 进入用户中心
      cy.get('[data-cy=user-center-link], .user-info').click()
      cy.url().should('include', '/user-center')
      
      // 进入设置页面
      cy.get('[data-cy=settings], .settings-tab').click()
      cy.wait(environment.timeouts.medium)
      
      // 修改设置
      cy.get('body').then(($body) => {
        // 语言设置
        if ($body.find('.language-select').length > 0) {
          cy.get('.language-select').select('中文')
        }
        
        // 通知设置
        if ($body.find('.notification-settings').length > 0) {
          cy.get('.notification-settings input[type="checkbox"]').first().check()
        }
        
        // 隐私设置
        if ($body.find('.privacy-settings').length > 0) {
          cy.get('.privacy-settings input[type="checkbox"]').first().check()
        }
        
        cy.log('系统设置已修改')
      })
      
      // 保存设置
      cy.get('[data-cy=save-settings], .save-settings-btn').click()
      cy.wait(environment.timeouts.medium)
    })

    it('用户可以查看系统通知', () => {
      // 用户登录
      cy.get('[data-cy=account-input]').type(testData.users.student.account)
      cy.get('[data-cy=password-input]').type(testData.users.student.password)
      cy.get('[data-cy=login-button]').click()
      
      cy.url().should('include', '/mainPage')
      cy.wait(environment.timeouts.medium)
      
      // 查看通知
      cy.get('[data-cy=notifications], .notification-bell').click()
      cy.wait(environment.timeouts.short)
      
      // 验证通知列表
      cy.get('body').then(($body) => {
        if ($body.find('.notification-item, .notification-list').length > 0) {
          cy.get('.notification-item, .notification-list').should('be.visible')
          cy.log('系统通知显示正常')
        } else {
          cy.contains('暂无通知').should('be.visible')
          cy.log('暂无通知，显示空状态')
        }
      })
    })
  })

  describe('用户中心API测试', () => {
    it('API - 获取用户信息', () => {
      cy.request({
        method: 'GET',
        url: `${microservicesConfig.apiGateway}/api/users/profile`,
        failOnStatusCode: false,
        headers: {
          'Authorization': 'Bearer test-token'
        }
      }).then((response) => {
        expect([200, 401]).to.include(response.status)
        
        if (response.status === 200) {
          expect(response.body).to.have.property('data')
          expect(response.body.data).to.have.property('account')
          cy.log('用户信息API响应正常')
        } else {
          cy.log(`用户信息API返回状态: ${response.status}`)
        }
      })
    })

    it('API - 更新用户信息', () => {
      const updateData = {
        name: `测试用户_${testUtils.generateRandomString(4)}`,
        email: `test.${testUtils.generateRandomString(4)}@example.com`
      }

      cy.request({
        method: 'PUT',
        url: `${microservicesConfig.apiGateway}/api/users/profile`,
        failOnStatusCode: false,
        body: updateData,
        headers: {
          'Content-Type': 'application/json',
          'Authorization': 'Bearer test-token'
        }
      }).then((response) => {
        expect([200, 401, 400]).to.include(response.status)
        
        if (response.status === 200) {
          cy.log('用户信息更新API响应正常')
        } else {
          cy.log(`用户信息更新API返回状态: ${response.status}`)
        }
      })
    })

    it('API - 修改密码', () => {
      const passwordData = {
        currentPassword: 'oldPassword',
        newPassword: 'newPassword@123'
      }

      cy.request({
        method: 'PUT',
        url: `${microservicesConfig.apiGateway}/api/users/password`,
        failOnStatusCode: false,
        body: passwordData,
        headers: {
          'Content-Type': 'application/json',
          'Authorization': 'Bearer test-token'
        }
      }).then((response) => {
        expect([200, 400, 401]).to.include(response.status)
        
        if (response.status === 200) {
          cy.log('密码修改API响应正常')
        } else {
          cy.log(`密码修改API返回状态: ${response.status}`)
        }
      })
    })
  })

  after(() => {
    // 清理测试数据
    cy.log('用户中心模块端到端测试完成')
  })
})
